#include "app_message.h"
#include "cJSON/cJSON.h"
#include "log/log.h"
#include "app_common.h"
#include "string.h"
#include "stdlib.h"

/**
 * 将字符数组格式的消息数据转换为json格式的消息数据
    消息数据包含
        连接类型：1 代表蓝牙连接
        设备id: "xx"
        消息体内容: "abcd"
    字符数组格式： 1 2 4 xxabcd
        字节1：连接类型
        字节2：设备id长度
        字节3：消息体长度
        字节4~n：设备id和消息体
    json格式: {"conn_type": 1, "id": "5858", "msg": "61626364"}
        
 */
char* app_message_charsToJSON(char* chars, int len)
{
    //提取连接类型
    int conn_type = chars[0];
    //提取设备id长度
    int id_len = chars[1];
    //提取消息体长度
    int msg_len = chars[2];

    //检查字符数组长度是否足够
    if (len != 3 + id_len + msg_len)
    {
        log_error("字符数组长度不正确");
        return NULL;
    }
    
    //提取设备id
    char id_chars[id_len];
    memcpy(id_chars, chars + 3, id_len);
    //提取消息体
    char msg_chars[msg_len];
    memcpy(msg_chars, chars + 3 + id_len, msg_len);
    //把设备id和消息体转换为十六进制字符串
    char* id_hex = app_common_charsToHexStr(id_chars, id_len);
    char* msg_hex = app_common_charsToHexStr(msg_chars, msg_len);
    //创建json对象
    cJSON* root = cJSON_CreateObject();
    cJSON_AddNumberToObject(root, "conn_type", conn_type);
    cJSON_AddStringToObject(root, "id", id_hex);
    cJSON_AddStringToObject(root, "msg", msg_hex);
    //将json对象转换为json字符串
    char* json = cJSON_PrintUnformatted(root);

    //释放json对象
    cJSON_Delete(root);
    //释放十六进制字符串
    free(id_hex);
    free(msg_hex);

    return json;

}

int app_message_jsonToChars(char* json,char* charsBuf, int bufLen)
{
    //解析json字符串
    cJSON* root = cJSON_Parse(json);
    if (root == NULL) {
        return -1;
    }
    //提取连接类型
    int conn_type = cJSON_GetObjectItem(root, "conn_type")->valueint;
    //提取设备id
    char* id = cJSON_GetObjectItem(root, "id")->valuestring;
    //提取消息体
    char* msg = cJSON_GetObjectItem(root, "msg")->valuestring;

    //将十六进制的设备id和消息体转换为字符数组
    int id_len = -1;
    int msg_len = -1;
    char* id_chars = app_common_hexStrToChars(id, &id_len);
    char* msg_chars = app_common_hexStrToChars(msg, &msg_len);

    //检查字符数组长度是否足够
    if (bufLen < 3 + id_len + msg_len)
    {
        log_error("字符数组缓存长度不够");
        return -1;
    }

    //将连接类型、设备id长度、消息体长度、设备id和消息体写入字符数组缓存
    charsBuf[0] = conn_type;
    charsBuf[1] = id_len;
    charsBuf[2] = msg_len;
    memcpy(charsBuf + 3, id_chars, id_len);
    memcpy(charsBuf + 3 + id_len, msg_chars, msg_len);

    //释放字符数组
    free(id_chars);
    free(msg_chars);
    //释放json对象
    cJSON_Delete(root);

    return 3 + id_len + msg_len;
}